היום אני אספר על התקפה בשם Sockstress/Slowloris/Slow Read ועל דרכים למניעתה.
איך זה עובד?
העיקרון של ההתקפה מתבסס על ההגבלה של השרת למספר חיבורים(sockets) שהוא יכול להחזיק בו זמנית עם הלקוחות. ועל זה שהשרת לא יודע להבדיל בין חיבור "טוב"(כלומר באמת בן אדם שרוצה לפתוח דף), לסתם חיבור שתלוי לו באוויר.
העניין הוא לדעת ליצור חיבורים כאלה שהשרת לא יסגור, אלא שימשיכו להיות תלויים באוויר. לדוגמה, התוכנה Slowloris עושה שאילתות חלקיות, היא מתחילה חיבור עם השרת, ואז שולחת את החלקים של השאילתה באיטיות, אבל לא יותר מדי איטית כדי שהשרת לא יסגור את החיבור. מה שנשאר לעשות זה לפתוח 1000 חיבורים כאלה בו זמנית, והשרת יפסיק להגיב למשתמשים רגילים, ורק יחכה לסיום של החיבורים האלה.
קצת היסטוריה
הראשונים שהציגו את ההתקפה Sockstress היו Outpost24 בספטמבר 2008. ההתקפה נהייתה פופולרית יותר תחת השם Slowloris, בזכות מנהל הבלוג ha.ckers, שבשנת 2009 הוציא תוכנה תחת אותו שם שמיישמת התקפה באותו עיקרון. התוכנה שימשה בין היתר להתקפת אתרים של שלטון איראן, כחלק ממחאה שהייתה באותו זמן בגלל הבחירות.
היום
היום אנחנו ב-2013 ועדיין רוב השרתים פגיעים להתקפה הזאת. ב-2011 יצאה תוכנה חדשה, שבה אני משתמש (למטרות שלום בלבד ;-)), העונה לשם SlowHTTPTest. היא מיישמת התקפה בשם Slow Read, שזה קצת שונה ממה ש-Slowloris עושה. בשונה ממנו, SlowHTTPTest עושה שאילתה רגילה לגמרי, אבל ברגע שהשרת מתחיל להחזיר תשובה, התוכנה אומרת שאין לה מקום בזיכרון, ואז השרת מתחיל לחכות ללקוח. פעם בכמה זמן התוכנה מורידה עוד קצת ביטים, כדי להחזיק את החיבור חי.
התקנת SlowHTTPTest
SlowHTTPTest עובד רק בלינוקס, ובכלל אפשר ליצור את ההתקפה הזאת רק מלינוקס, כי ו'ינדוס מגביל את מספר החיבורים שאתם יכולים לפתוח לבערך 100-200, שזה בדרך כלל לא מספיק.
תורידו את הגרסה האחרונה, ותריצו את הפקודות הבאות:
$ tar -xzvf slowhttptest-x.x.tar.gz
$ cd slowhttptest-x.x
$ ./configure --prefix=PREFIX
$ make
$ sudo make install
$ cd slowhttptest-x.x
$ ./configure --prefix=PREFIX
$ make
$ sudo make install
במקום PREFIX תרשמו את המקום המדויק על המחשב בו אתם רוצים להתקין את SlowHTTPTest.
אצלי באובונטו התוכנה ביקשה את g++ ואת libssl-dev. יכול להיות שכבר יש לכם, אם לא, אז באובונטו אתם יכולים להתקין את זה בצורה הזאת.
sudo apt-get install g++ libssl-dev
שימוש לדוגמה בתוכנה הזאת:
slowhttptest -c 1000 -u http://example.com
קצת יותר אגרסיבי:
slowhttptest -c 1000 -X -r 200 -w 512 -y 1024 -n 5 -z 32 -k 3 -u http://www.example.com -p 3
בכותרת הייתי אפילו קצת צנוע. לפי מה שבדקתי עד עכשיו, יותר מחצי מהאתרים הבינוניים בישראל נופלים אחרי הפקודה הזאת.
העיקר – איך מגנים על השרת מהתקפה הזאת
זה לא קשה בכלל. קודם כול צריך להגביל את כמות החיבורים שכל IP יכול לפתוח עם השרת שלכם, ודבר שני לצמצם את זמן החיבור המקסימלי.
אני אסביר איך עושים את זה באפאצ'י.
הגבלת כמות החיבורים של כל IP
מגבילים את כמות החיבורים בעזרת המודול mod_securit.
התקנה באובונטו מתבצעת עם פקודה אחת:
sudo apt-get install libapache-mod-security
אחרי זה כנסו ל-etc/apache2/mods-enabled/mod-security.conf ותוסיפו את השורה הבאה איפשהו בין <IfModule security2_module> לבין </IfModule>:
SecWriteStateLimit 100
עכשיו בניסיון לתקוף את השרת שלכם, התוקף יראה שהשרת נפל, אבל רק כי בחיבור 101 שהוא יעשה עם השרת, הוא יחטוף באן IP (זמני).
ב-Log של השרת שלכם (var/log/apache2/error.log) יהיה רשום משהו כזה:
ModSecurity: Access denied with code 400. Too many threads [101] of 100 allowed in WRITE state from *.*.*.* - Possible DoS Consumption Attack [Rejected]
צמצום זמן החיבור המקסימלי
אפשר לצמצם את זמן החיבור המקסימלי בעזרת המודול reqtimeout. הוא מותקן אוטומטית החל מגרסת Apache 2.2.15 במיוחד להגנה מההתקפה הזאת (אבל הוא לבד לא מספיק).
כנסו ל-etc/apache2/mods-enabled/reqtimeout.conf.
אם אתם לא משתמשים ב-SSL אתם יכולים להקטין משמעותית את המספרים, אני הגדרתי בצורה הזאת:
RequestReadTimeout header=1-2,minrate=500
RequestReadTimeout body=1,minrate=500
RequestReadTimeout body=1,minrate=500
למידע נוסף
החור שעליו מבוססת התוכנה SlowHTTPTest הוא בקצרה – הלקוח יכול להגיד לשרת שיש לו 0 מקום בזיכרון, כך שהשרת יפסיק לשלוח לו מידע, אבל לא יסגור את החיבור. לא בקצרה:
http://www.kb.cert.org/vuls/id/723308
הסבר מפורט על התוכנה SlowHTTPTest:
http://code.google.com/p/slowhttptest/wiki/InstallationAndUsage
מפתח התוכנה SlowHTTPTest מציע גם הוא אפשרויות להגנה:
https://community.qualys.com/blogs/securitylabs/2011/11/02/how-to-protect-against-slow-http-attacks
וכאן המפתח מסביר בפרוט איך התוכנה עובדת:
https://community.qualys.com/blogs/securitylabs/2012/01/05/slow-read
תגובות לכתבה:
אגב, nginx בהתקנה הדיפולטית שלו תחת debian לא מושפע
אבל בהגנה הדיפולטית תחת centos הכן כן.
מאוד מעניין, תודה
*יש דיי הרבה שגיאות כתיב, לתשומת לבך
איך אני מיישם את זה בעצמי (את ההתקפה) נניח בC#? התחלתי ללמוד יותר אבטחת מידע, נהיה פופולרי מאז התקפת הסייבר :)
אני לא מבין גדול בזה, אבל לפי מה שהבנתי זה לא משהו שאתה יכול לעשות עם C שארפ. "העיקרון בהתקפה הזאת הוא פתיחה הרבה חיבורים לשרת בו זמנית [...]" איפה אתה רואה שרת ב-C#? דברים כאלה זה פשוט שורת הפקודה.
לא.... איך אתה יכול לממש את המתקפה בC#, לכמה זמן לפתוח את החיבורים, איך לדווח...
הבן אדם שפיתח את slowhttptest מסביר די מפורט איך ההתקפה עובדת כאן:
https://community.qualys.com/blogs/securitylabs/2012/01/05/slow-read
אפשר ליצור את ההתקפה בכל שפה שאפשר בה ליצור חיבורים עם השרת(sockets), כולל C#.
יש אפילו ב PHP את ההתקפה הזאת חחח:
http://seclists.org/fulldisclosure/2009/Jun/207